package gff.bsn;

import gff.constantes.Constantes;
import gff.model.bean.BeanFactory;
import gff.model.dao.CatalogosImp;
import gff.model.dao.ConcentradoImp;
import gff.model.dao.UnidadesDAOImp;
import gff.vo.ConcentradoVO;
import gff.vo.InsumosVO;
import gff.vo.ReglasVO;
import gff.vo.SeparacionFuenteOrigen;
import gff.vo.UnidadesVO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import org.apache.log4j.Logger;

public class UnidadesBsn {

	String nombreFuente = "";
	
	private static final Logger log = Logger.getLogger(UnidadesBsn.class);
	public static Integer cont  = new Integer(0);
	public static List<UnidadesVO> getUnidades() throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getUnidades ");
		List<UnidadesVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getUnidades() ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getUnidades: "
					+ e.getMessage());
		}

		return respuesta;

	}
	
	public static List<UnidadesVO> getUnidadesReglas() throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getUnidades ");
		List<UnidadesVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getUnidadesRegla() ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getUnidades: "
					+ e.getMessage());
		}

		return respuesta;

	}
	
	
	public static UnidadesVO getUni() throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getUni ");
		UnidadesVO respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getUnidad() ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getUnidades: "
					+ e.getMessage());
		}

		return respuesta;

	}

	public static List<UnidadesVO> getUnidad() throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getUnidades ");
		List<UnidadesVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getUnidades() ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getUnidades: "
					+ e.getMessage());
		}

		return respuesta;

	}


	public static List<ReglasVO> getReglas( ReglasVO reglas) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getReglas ");
		List<ReglasVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getReglas(reglas);

		} catch (Exception e) {
			log.error("Ocurrio un error en getReglas: "
					+ e.getMessage());
		}

		return respuesta;

	}

	public static ArrayList<ReglasVO> getRegla( ReglasVO reglas) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getRegla ");
		ArrayList<ReglasVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getRegla(reglas) ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getRegla: "
					+ e.getMessage());
		}

		return respuesta;

	}

	public static List<ConcentradoVO> getConcentrado( ) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getConcentrado ");
		List<ConcentradoVO> respuesta = null;
		try {

			UnidadesDAOImp dao = (UnidadesDAOImp) BeanFactory.getBean("UnidadesDAO");

			respuesta = dao.getConcentrado() ;

		} catch (Exception e) {
			log.error("Ocurrio un error en getConcentrado: "
					+ e.getMessage());
		}

		return respuesta;

	}

	public static void updateFuentes( InsumosVO insumo , SeparacionFuenteOrigen separacion , HashMap<String, ArrayList<InsumosVO>> fuentesSeparadas , ReglasVO reglaUnidad , UnidadesVO unidad) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: updateFuentes ");

		try {
			ConcentradoImp.updateFuentes(insumo, separacion,  fuentesSeparadas, reglaUnidad, unidad) ;	

		} catch (Exception e) {
			log.error("Ocurrio un error en updateFuentes: "
					+ e.getMessage());
		}



	}

	public static HashMap<String, ArrayList<InsumosVO>>  getFuentesSeparadas( InsumosVO insumo , SeparacionFuenteOrigen separacion ) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getFuentesSeparadas ");

		try {
			return CatalogosImp.getFuentes() ;	

		} catch (Exception e) {
			log.error("Ocurrio un error en updatgetFuentesSeparadaseFuentes: "
					+ e.getMessage());
		}

		return null;

	}
	public static SeparacionFuenteOrigen getCorrigeFuente( ArrayList<ReglasVO> reglas , UnidadesVO unidad) throws Exception {

		log.info("Clase:UnidadesBsn Metodo: getCorrigeFuente ");

		InsumosVO insumo = new InsumosVO();

		ReglasVO res = new ReglasVO();


		SeparacionFuenteOrigen separacion= new SeparacionFuenteOrigen(); 
		
		HashMap<String, ArrayList<InsumosVO>> fuentesSeparadas = CatalogosImp.getFuentes();
		
		boolean bandera =  false;
		boolean banderaReglas =  false;
		try {

			Constantes.getInsumosList().addAll(CatalogosBsn.getListaInsumos());

			for ( int i = 0 ; i < Constantes.getInsumosList().size() ; i++){

				bandera =  false;

				insumo =  Constantes.getInsumosList().get(i) ;

				for (ReglasVO reglaUnidad : reglas){
					banderaReglas = false;
					for (String fuente : insumo.getFuentes() ){

						if ( reglaUnidad.getFuente().equals(fuente) ){;

						insumo.setFuenteModifica(fuente);

						updateFuentes( insumo , separacion , fuentesSeparadas , reglaUnidad , unidad);

						res.getFuentes().append("Update se corrige la clave" +  insumo.getClave() + " a la fuente" + fuente +"\n" ).trimToSize() ;
						bandera = true;
						res.setEstatusCobro(reglaUnidad.getEstatusCobro());
						res.setEstatusDispensa(reglaUnidad.getEstatusDispensa());
						} 
						if(bandera){
							break;
						} 


					}

					if (bandera){
						banderaReglas = true;
						break;
					}

				}

				if(!banderaReglas){
					insumo.setFuenteModifica(Constantes.FUENTE_RESPALDO);
					updateFuentes( insumo,separacion , fuentesSeparadas, res, unidad);
					res.getGeneral().append("Update se corrige la clave" +  insumo.getClave() + " a la fuente general \n" );
				}





			}


		} catch (Exception e) {
			log.error("Ocurrio un error en getCorrigeFuente: "
					+ e.getMessage());
		}

		
		separacion.separacion().putAll( fuentesSeparadas );
		
		return separacion;

	}

	public static HashMap<String, ArrayList<InsumosVO>>  clonaMap(HashMap<String, ArrayList<InsumosVO>> separacion  ) {
			HashMap<String, ArrayList<InsumosVO>> seperacionTempHashMap = new HashMap<String, ArrayList<InsumosVO>>();
		
			Iterator<?> it = separacion.entrySet().iterator();
			
			while (it.hasNext()) {

				@SuppressWarnings("rawtypes")
				Map.Entry e = (Map.Entry) it.next();

				seperacionTempHashMap.put((String) e.getKey(), separacion.get(e.getKey()) );
				
			}
		
		return seperacionTempHashMap;
		
	}
	
	
//	public static SeparacionFuenteOrigen getSeparacionFuentes( SeparacionFuenteOrigen separacion) throws Exception {
//
//		log.info("Clase:UnidadesBsn Metodo: getSeparacionFuentes ");
//
//		//		ArrayList<InsumosVO> insumo = new  ArrayList<InsumosVO>();
//		//		
//		HashMap<String , FuentesVO > fuentesMap = new HashMap<String , FuentesVO>();
//		//		
//		ArrayList<FuentesVO> fuentes = new ArrayList<FuentesVO>();
//
//		String nombreFuente = "";
//		for ( FuentesVO fuente : fuentes){
//			if (fuentesMap.isEmpty()){
//				
//				fuentesMap.put(fuente.getId(), fuente);
//				
//				;
//				//ArrayList<InsumosVO>  nombreFuente  = new ArrayList<InsumosVO>(); 
//
//			}
//		}
//
//
//
//		//		for (int i  = 0 ; i < separacion.getMedOrigen1().size() ; i++){
//		//			
//		//			if ( fuentes.isEmpty()){
//		//				
//		//				fuentes.put(separacion.getMedOrigen1().get(i).getFuenteModifica(), insumo);
//		//				
//		//			}
//		//			
//		//			
//		//		}
//
//
//		return null;
//	}

}
